package ${packagePrefix}.${domainObjectName?lower_case}.infrastructure.repository.query;

import ${packagePrefix}.${domainObjectName?lower_case}.domain.model.aggregates.${domainObjectName}Aggregate;
import ${packagePrefix}.${domainObjectName?lower_case}.infrastructure.repository.dataobject.${domainObjectName}DO;
import ${packagePrefix}.${domainObjectName?lower_case}.domain.model.query.*;
import ${packagePrefix}.common.pagination.PageResult;

import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Param;
import java.util.*;

<#if generateComments>
/**
 * ${domainObjectName}查询仓储接口
 * <p>
 * 专门用于处理复杂查询场景的仓储接口，与命令仓储分离，符合CQRS模式。
 * 查询仓储专注于快速高效地查询数据，可以直接返回DTO对象，
 * 不需要构建完整聚合，从而提高性能。
 * </p>
 *
 * @author Auto Generated
 */
</#if>
@Repository
public interface ${domainObjectName}QueryRepository {

    /**
     * 根据条件分页查询${domainObjectName}列表
     *
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<${domainObjectName}ListDTO> query${domainObjectName}ByPage(${domainObjectName}PageQuery query);
    
    /**
     * 根据ID查询${domainObjectName}详细信息
     *
     * @param id ${domainObjectName} ID
     * @return ${domainObjectName}详情DTO
     */
    ${domainObjectName}DetailDTO get${domainObjectName}Detail(Long id);
    
    /**
     * 根据名称模糊查询${domainObjectName}
     *
     * @param name 名称关键字
     * @return ${domainObjectName}列表
     */
    List<${domainObjectName}ListDTO> find${domainObjectName}ByNameLike(String name);
    
    /**
     * 根据多个ID批量查询${domainObjectName}
     *
     * @param ids ID集合
     * @return ${domainObjectName}列表
     */
    List<${domainObjectName}ListDTO> find${domainObjectName}ByIds(@Param("ids") List<Long> ids);
    
    <#if hasStatusField>
    /**
     * 根据状态查询${domainObjectName}
     *
     * @param status 状态
     * @return ${domainObjectName}列表
     */
    List<${domainObjectName}ListDTO> find${domainObjectName}ByStatus(Integer status);
    </#if>
    
    <#if specialRequirements?? && specialRequirements?contains("统计")>
    /**
     * 查询${domainObjectName}总数
     *
     * @return ${domainObjectName}总数
     */
    Long count${domainObjectName}();
    
    /**
     * 根据条件查询${domainObjectName}统计数据
     *
     * @param query 查询条件
     * @return 统计结果
     */
    ${domainObjectName}StatisticsDTO get${domainObjectName}Statistics(${domainObjectName}StatisticsQuery query);
    </#if>
    
    <#if specialRequirements?? && specialRequirements?contains("导出")>
    /**
     * 查询要导出的${domainObjectName}数据
     *
     * @param query 查询条件
     * @return 导出数据列表
     */
    List<${domainObjectName}ExportDTO> query${domainObjectName}ForExport(${domainObjectName}ExportQuery query);
    </#if>
    
    <#if specialRequirements?? && specialRequirements?contains("审批")>
    /**
     * 查询待审批的${domainObjectName}列表
     *
     * @param query 查询条件
     * @return 待审批数据列表
     */
    List<${domainObjectName}ApprovalDTO> findPending${domainObjectName}Approvals(${domainObjectName}ApprovalQuery query);
    </#if>
    
    /**
     * 复杂条件查询${domainObjectName}
     *
     * @param query 自定义查询条件
     * @return 查询结果
     */
    List<${domainObjectName}ListDTO> findBy${domainObjectName}Criteria(${domainObjectName}CriteriaQuery query);
    
    /**
     * 查询指定时间范围内创建的${domainObjectName}
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return ${domainObjectName}列表
     */
    List<${domainObjectName}ListDTO> find${domainObjectName}ByTimeRange(Date startTime, Date endTime);
    
    <#if specialRequirements?? && specialRequirements?contains("关联")>
    /**
     * 查询与指定实体关联的${domainObjectName}列表
     *
     * @param relatedEntityId 关联实体ID
     * @param relationType 关联类型
     * @return ${domainObjectName}列表
     */
    List<${domainObjectName}ListDTO> find${domainObjectName}ByRelation(Long relatedEntityId, String relationType);
    </#if>
} 